package com.zk.client;

import java.util.List;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Stat;


/**
 * 创建zk节点
 * @author zyf
 *
 */
public class ZkNode {

	public static final String ZK_ADDRESS = "127.0.0.1";
	
	public static final Integer ZK_TIMEOYT = 10000;
	
	public static final String ZK_PATH = "/zyf";
	
	public static final String ZK_CHILDER_PATH = "/zyf/data";
	
	public static final String ZK_TMP_PATH = "/tmp";
	
	public static void main(String [] args){
		try{
			/**
			 * zk链接 
			 */
			Watcher watch = new Watcher() { 
	            // 监控所有被触发的事件
	            public void process(WatchedEvent event) { 
	                System.out.println("已经触发了" + event.getType() + "事件！"); 
	            } 
	        };
			
			ZooKeeper zk = new ZooKeeper(ZK_ADDRESS, ZK_TIMEOYT,watch); 
			
			/**
			 *  创建一个给定的目录节点 path, 并给它设置数据
			 *  
			 *  CreateMode 有4个参数 
			 *  PERSISTENT：持久化目录节点，这个目录节点存储的数据不会丢失；
			 *  PERSISTENT_SEQUENTIAL：顺序自动编号的目录节点，这种目 录节点会根据当前已近存在的节点数自动加 1，然后返回给客户端已经成功创建的目录节点名；
			 *  EPHEMERAL：临时目录节点，一旦创建这个节点的客户端与服务器端口也就是 session 超时，这种节点会被自动删除；
			 *  EPHEMERAL_SEQUENTIAL：临时自动编号节点。
			 *  
			 */
			
			/**
			 * 目录节点的path不能相同
			 * 永久节点
			 */
//			zk.create(ZK_PATH, "hello world".getBytes() , Ids.OPEN_ACL_UNSAFE , CreateMode.PERSISTENT);
			
			/**
			 * 临时节点
			 */
//			zk.create(ZK_TMP_PATH, "祖国，你好".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
			
			
			/**
			 * 创建子节点的数据
			 */
//			zk.create(ZK_CHILDER_PATH, "hello world charild".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
			
			/**
			 * 删除节点数据
			 */
//			zk.delete(ZK_TMP_PATH, -1);
			
			/**
			 * 判断某个 path 是否存在，并设置是否监控这个目录节点，
			 * 这里的 watcher 是在创建 ZooKeeper 实例时指定的 watcher，exists方法还有一个重载方法，可以指定特定的watcher。
			 */
			if(null == zk.exists(ZK_TMP_PATH, watch)){
				System.out.println("zk节点不存在，或者已删除");
				/**
				 * 如果节点不存在 就创建临时的节点
				 */
//				zk.create(ZK_TMP_PATH, "祖国你好".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
			}else{
				System.out.println("守望者数据："+watch);
			}
//			System.out.println(zk.exists(ZK_PATH, watch));
			
			
			List<String> nodeList = zk.getChildren(ZK_PATH, watch);
			for(String str : nodeList){
				System.out.println(ZK_PATH+"下的节点："+str);
			}
			
			/**
			 * 设置节点的数据
			 */
//			zk.setData(ZK_CHILDER_PATH, "数据更新".getBytes(), -1);
			
			/**
			 * 获取指定节点订单数据  暂时没有看到追加数据的方法
			 */
			System.out.println(new String(zk.getData(ZK_CHILDER_PATH, watch, null)));
			
			/**
			 * 获取指定目录的访问权限
			 */
			List<ACL> acls = zk.getACL(ZK_CHILDER_PATH, zk.exists(ZK_CHILDER_PATH, watch));
			for(ACL acl : acls){
				System.out.println(ZK_CHILDER_PATH+"的访问权限："+acl);
			}
			
			/**
			 * zk节点授权访问
			 */
			
			
			
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
}
